/**
 * 修改记录:
 * 25-09-11     郑朝军
 */

/**
 * uni.cxapp.EventHandlers
 * ZGIS-事件处理相关方法
 *
 * @class
 * @memberof    uni.cxapp.EventHandlers
 */
export default 
{
  methods: 
  {
    /**
     * 字段值变化处理
     * @param {Object} attMap 表单数据
     * @param {string} colName 字段名
     */
    onFieldChange(attMap, colName) 
    {
      this.editingColName = colName
      this.internalAttMap = { ...attMap }

      // 处理规则表
      this.handleRuleTab(this.ruleTabCheckTime.change)
    
      // 触发更新事件
      this.$emit('fld-change', this.internalAttMap, colName)
    },

    /**
     * 字段变化处理（兼容旧版本）     
     * @param {Object} fld 字段对象
     */
    onFldChange(fld) 
    {                
      this.internalAttMap[fld.colname] = fld.value        
      this.onFieldChange(this.internalAttMap, fld.colname)
    },

    /**
     * 按钮点击处理
     * @param {Object} fld 字段对象
     * @param {*} fldValue 字段值
     */
    async onValButton(fld, fldValue) 
    {
      try 
      {
        // 清除编辑状态
        this.editingColName = null

        // 执行函数之前的值
        const oldVal = this.internalAttMap[fld.colname]

        // 尝试处理字段源配置
        let result = await uni.cxapp.FldSrcHandler.handlerFldSrcCfg({
          fld,
          attMap: this.internalAttMap,
          attController: this
        })

        if (result == null) 
        {
          // 查找 MS 类型的字段值
          const msFieldValue = this.fldValues?.find(e => e.dbvalue === 'MS')
          const formatValue = uni.cxapp.CxValueUtil.formatValue(msFieldValue?.dispc)

          if (typeof formatValue === 'string' && formatValue.length > 0) 
          {
            // 处理字段值配置
            result = await this.handlerFldValueCfg(msFieldValue)
          } 
          else 
          {
            // 执行点击函数
            if (this.clickFunction) 
            {
              result = await this.clickFunction(fld, this.internalAttMap, fldValue)
            }
            
            // 更新字段值
            this.internalAttMap[fld.colname] = result ?? this.internalAttMap[fld.colname]
          }
        }

        // 更新最新值
        const latestValue = uni.cxapp.CxValueUtil.isEmptyObj(this.internalAttMap[fld.colname]) 
          ? '' 
          : String(this.internalAttMap[fld.colname])

        // 如果前后的值不一致，则执行onChange方法
        if (String(oldVal) !== latestValue) 
        {
          this.onFieldChange(this.internalAttMap, fld.colname)
        }

        return result
      } 
      catch (error) 
      {
        console.error('按钮点击失败:', error)
        this.handleError?.(error)
        throw error
      }
    },
     
    /**
     * 处理字段值配置
     * @param {Object} fldValue 字段值对象
     * @returns {Promise} 处理结果
     */
    async handlerFldValueCfg(fldValue) 
    {
      if (!fldValue) return null

      try 
      {       
        return await uni.cxapp.FldSrcHandler.handlerFuncWidget({
          dispc: fldValue.dispc,
          fld: this.currentFld || {},
          attMap: this.internalAttMap,
          attController: this
        })
      } 
      catch (error) 
      {
        console.warn('处理字段值配置失败:', error)
        return null
      }
    },
 
    /**
     * 文件数据处理
     * @param {Object} fileData 文件数据
     */
    onFileData(fileData) 
    {
      console.log('文件数据:', fileData)

      if (this.fileAction) 
      {
        this.fileAction()
      }
    },

    /**
     * 获取自定义组件
     * @param {Object} fld 字段对象
     * @returns {*} 自定义组件
     */
    getCustomComponent(fld) 
    {
      if (this.attItemBuilder) 
      {
        return this.attItemBuilder(this, fld, this.internalAttMap, this.mode, this)
      }

      return fld.widget || null
    },

    /**
     * 获取插入的组件
     * @param {Object} fld 字段对象
     * @returns {*} 插入的组件
     */
    getInsertWidget(fld) 
    {
      if (this.insertViewFunction) 
      {
        return this.insertViewFunction(fld)
      }

      return null
    },

    /**
     * 判断是否显示分组标题
     * @param {string} groupName 分组名称
     * @param {Array} groupFlds 分组字段
     * @returns {boolean} 是否显示标题
     */
    shouldShowGroupTitle(groupName, groupFlds) 
    {      
      return groupName !== groupFlds[0]?.colname &&
             this.getVisibleFields(groupFlds).length > 0
    }
  }
}